/*
 * KeyBoard.h
 *
 *  Created on: Apr 28, 2016
 *      Author: MJY
 */

#ifndef KEYBOARD_H_
#define KEYBOARD_H_

/////////////////////////////////////  按键I/O相关配置   ////////////////////////////////////////////////////////////////////
#define Key_Up           gpio_get(E0)
#define Key_Down         gpio_get(E3)
#define Key_Left         gpio_get(E2)
#define Key_Right        gpio_get(I3)
#define Key_Center       gpio_get(I2)


#define KeyUPin          E0
#define KeyDPin          E3
#define KeyLPin          E2
#define KeyRPin          I3
#define KeyCPin          I2

#define Hight            1       //高电平
#define Low              0       //低电平

//配置按键按下的时候和松开的时候的电平状态
#define Key_Press        Hight   //按键按下时的电平状态
#define Key_Release      Low     //按键松开是的电平状态

/////////////////////////////////////  按键检测相关配置   ////////////////////////////////////////////////////////////////////

//按键短按的时候是下降沿触发还是上升沿触发触发方式同时只能存在一个，两个都存在的时候上升沿优先级比较高，下降沿无效
//注意：两个触发方式都为0的时候短按会失效
#define Key_Trigger_Rising_Edge     1  //上升沿触发：按键短按松开的时候才返回按键值
#define Key_Trigger_falling_Edge    0  //下降沿触发：按键短按按下的时候就返回按键值

//按键短按多久进入连击模式的时间，这个时间大概 = 10ms * Time_Multiple_Hit,最大为255（用的uint8_t型变量来计数）
#define Time_Multiple_Hit  15

//进入连击模式后连击的速度,每次连击之间的间隔为 Speed_Multiple_Hit * 10 ms
#define Speed_Multiple_Hit  8

//在长按连击的模式下，一直长按进入超级连击模式的时间，时间大概 = 10ms * Time_Super_Multiple_Hit
#define Time_Super_Multiple_Hit  150

//进入超级连击模式后连击的速度，每次连击之间的间隔为 Super_Speed_Multiple_Hit * 10 ms  如果速度和长按连击一样，相当于没有超级连击
#define Super_Speed_Multiple_Hit 2

//替换延迟函数
#define KEY_Delay  systick_delay_ms


//调参界面ChangeParameterVal()函数修改某变量的值的时候使用
typedef enum{

	pint8_t,
	puint8_t,
	pint16_t,
	puint16_t,
    pint32_t,
    puint32_t,
	pfloat,
	pdouble,
}parameter_type;
 
void Key_IO_Init();
uint8_t GetKeyInpt();


void OLED_ConfigParameter();
void clean_invalid_char(uint8_t endx);
void ChangeParameterVal(parameter_type ptype,void* ppara,double precision,uint8_t keyx);
void ChangeFlagVal(uint8_t *flag,uint8_t keyx,uint8_t min,uint8_t max);

#endif /* KEYBOARD_H_ */
